]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
status/bluetooth: Fix remembering set up devices
authorFlorian Müllner <fmuellner@gnome.org>
Mon, 8 Aug 2022 01:10:06 +0000 (03:10 +0200)
committerMarge Bot <marge-bot@gnome.org>
Wed, 10 Aug 2022 17:19:07 +0000 (17:19 +0000)
It is generally not possible to differentiate between systems
without bluetooth support, and systems where a bluetooth adapter
is powered down.

We work around that by tracking whether there are any set up devices,
and keep the bluetooth visible in that case, even when no adapter
is present.

However commit eeabdd150c7 moved updating the setting into the code
that handles adapter changes, which is exactly the place where we
carefully avoid changing the setting because it would be too
unreliable (devices may have already disappeared, or not yet
appeared).

Fix this by changing _setHadSetupDevices() to _syncHadSetupDevices()
and call that everywhere _sync() used to be called, *except* on
adapter changes.

https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5714

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2409>

js/ui/status/bluetooth.js

index 580121a8da5caacec7bd2e4b155c802e83172c31..f0a69238091b30b066f3f2c5f7b56f89cb6b2487 100644 (file)
@@ -41,9 +41,6 @@ const BtClient = GObject.registerClass({
         this._client.connect('notify::default-adapter', () => {
             const newAdapter = this._client.default_adapter ?? null;
 
-            if (newAdapter && this._adapter)
-                this._setHadSetupDevices([...this.getDevices()].length > 0);
-
             this._adapter = newAdapter;
             this._deviceNotifyConnected.clear();
             this.emit('devices-changed');
@@ -75,10 +72,12 @@ const BtClient = GObject.registerClass({
             this._connectDeviceNotify(deviceStore.get_item(i));
 
         this._client.connect('device-removed', (c, path) => {
+            this._syncHadSetupDevices();
             this._deviceNotifyConnected.delete(path);
             this.emit('devices-changed');
         });
         this._client.connect('device-added', (c, device) => {
+            this._syncHadSetupDevices();
             this._connectDeviceNotify(device);
             this.emit('devices-changed');
         });
@@ -117,17 +116,25 @@ const BtClient = GObject.registerClass({
         if (this._devicesChangedId)
             return;
         this._devicesChangedId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {
+            this._syncHadSetupDevices();
             delete this._devicesChangedId;
             this.emit('devices-changed');
             return GLib.SOURCE_REMOVE;
         });
     }
 
-    _setHadSetupDevices(value) {
-        if (this._hadSetupDevices === value)
+    _syncHadSetupDevices() {
+        const {defaultAdapter} = this._client;
+        if (!defaultAdapter || !this._adapter)
+            return; // ignore changes while powering up/down
+
+        const [firstDevice] = this.getDevices();
+        const hadSetupDevices = !!firstDevice;
+
+        if (this._hadSetupDevices === hadSetupDevices)
             return;
 
-        this._hadSetupDevices = value;
+        this._hadSetupDevices = hadSetupDevices;
         global.settings.set_boolean(
             HAD_BLUETOOTH_DEVICES_SETUP, this._hadSetupDevices);
     }